/* SPDX-License-Identifier: MIT */
/* Adapted from musl v1.2.1. Copyright © 2005-2020 Rich Felker, et al. */

#include "api.h"

#define BITOP(a,b,op) \
 ((a)[(size_t)(b)/(8*sizeof *(a))] op (size_t)1<<((size_t)(b)%(8*sizeof *(a))))

size_t strspn(const char* s, const char* c) {
    const char* a = s;
    size_t byteset[32/sizeof(size_t)] = { 0 };

    if (!c[0])
        return 0;

    if (!c[1]) {
        for (; *s == *c; s++);
        return s - a;
    }

    for (; *c && BITOP(byteset, *(unsigned char*)c, |=); c++);
    for (; *s && BITOP(byteset, *(unsigned char*)s, &); s++);
    return s - a;
}
